package com.qibao.toolkit.exception;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.springframework.util.StringUtils;

import java.util.Collection;
import java.util.Map;
import java.util.Objects;

/**
 * 业务断言，判断当前业务条件，如果不满足的话，通过抛出自定义业务异常，来终止当前流程，由自定义异常处理策略{@link BusinessExceptionHandlerStrategy}
 * 捕获，进行日志打印以及ResponseModel.ERROR(message,false)的返回；业务条件判断，提供了 boolean , null , Collection ,Map ,String  empty值 等常用判断
 *
 * @author wangcheng
 * @version $Id: BusinessAssert.java, v0.1 2018/10/10 18:37 wangcheng Exp $$
 */
public class BusinessAssert {

    private BusinessAssert() throws IllegalAccessException {
        throw new IllegalAccessException("BusinessAssert 不能被实例化");
    }


    /**
     * 抛出一个BusinessException异常信息,带有自定义日志信息
     */
    public static void asserts(String message, String logInfo) {
        throw new BusinessException(message, logInfo);
    }

    /**
     * 抛出一个BusinessException异常信息,使用业务信息作为日志信息
     */

    public static void asserts(String message) {
        asserts(message, message);
    }


    /**
     * 判断为true是通过，否则抛出BusinessException 异常,使用自定义日志信息
     */
    public static void assertTrue(Boolean condition, String message, String logInfo) {

        if (!condition) {
            asserts(message, logInfo);
        }

    }

    /**
     * 判断为true是通过，否则抛出BusinessException 异常，使用message作为日志信息
     */
    public static void assertTrue(Boolean condition, String message) {

        assertTrue(condition, message, message);

    }

    /**
     * 判断为false是通过，否则抛出BusinessException 异常,使用自定义信息作为日志信息
     */
    public static void assertFalse(Boolean condition, String message, String logInfo) {
        assertTrue(!condition, message, logInfo);
    }

    /**
     * 判断为false是通过，否则抛出BusinessException 异常，使用message作为日志信息
     */
    public static void assertFalse(Boolean condition, String message) {
        assertFalse(condition, message, message);
    }

    /**
     * 判断不为空时通过，否则抛出BusinessException异常，使用自定义信息作为日志信息
     */
    public static void assertNull(Object object, String message, String logInfo) {

        assertTrue(Objects.isNull(object), message, logInfo);
    }

    /**
     * 判断不为空时通过，否则抛出BusinessException异常，使用message作为日志信息
     */
    public static void assertNull(Object object, String message) {

        assertNull(object, message, message);
    }

    /**
     * 判断不为空时通过，否则抛出BusinessException异常,使用用户自动定义异常信息作为日志信息
     */
    public static void assertNotNull(Object object, String message, String logInfo) {

        assertFalse(Objects.isNull(object), message, logInfo);
    }

    /**
     * 判断不为空时通过，否则抛出BusinessException异常，使用message作为日志信息
     */
    public static void assertNotNull(Object object, String message) {

        assertNotNull(object, message, message);
    }

    /**
     * 判断集合为空时通过，否则抛出异常，使用自定义日志信息作为日志输出
     */
    public static void assertEmpty(Collection collection, String message, String logInfo) {
        assertTrue(CollectionUtils.isEmpty(collection), message, logInfo);
    }

    /**
     * 判断集合为空时通过，否则抛出异常，使用message信息作为日志输出
     */
    public static void assertEmpty(Collection collection, String message) {
        assertEmpty(collection, message, message);
    }

    /**
     * 判断集合不为空时通过，否则抛出异常，使用自定义日志信息作为日志输出
     */
    public static void assertNotEmpty(Collection collection, String message, String logInfo) {
        assertFalse(CollectionUtils.isEmpty(collection), message, logInfo);
    }

    /**
     * 判断集合不为空时通过，否则抛出异常，使用message信息作为日志输出
     */
    public static void assertNotEmpty(Collection collection, String message) {
        assertNotEmpty(collection, message, message);
    }

    /**
     * 判断map为空时通过，否则抛出异常，使用自定义日志信息作为日志输出
     */
    public static void assertEmpty(Map map, String message, String logInfo) {
        assertTrue(MapUtils.isEmpty(map), message, logInfo);
    }

    /**
     * 判断map为空时通过，否则抛出异常，使用message信息作为日志输出
     */
    public static void assertEmpty(Map map, String message) {
        assertEmpty(map, message, message);
    }

    /**
     * 判断map不为空时通过，否则抛出异常，使用自定义日志信息作为日志输出
     */
    public static void assertNotEmpty(Map map, String message, String logInfo) {
        assertFalse(MapUtils.isEmpty(map), message, logInfo);
    }

    /**
     * 判断map不为空时通过，否则抛出异常，使用message信息作为日志输出
     */
    public static void assertNotEmpty(Map map, String message) {
        assertNotEmpty(map, message, message);
    }


    /**
     * 判断字符串为空时通过，否则抛出异常，使用自定义日志信息作为日志输出
     */
    public static void assertEmpty(String string, String message, String logInfo) {
        assertTrue(StringUtils.isEmpty(string), message, logInfo);
    }

    /**
     * 判断字符串为空时通过，否则抛出异常，使用message信息作为日志输出
     */
    public static void assertEmpty(String string, String message) {
        assertEmpty(string, message, message);
    }

    /**
     * 判断字符串不为空时通过，否则抛出异常，使用自定义日志信息作为日志输出
     */
    public static void assertNotEmpty(String string, String message, String logInfo) {
        assertTrue(StringUtils.hasText(string), message, logInfo);
    }

    /**
     * 判断字符串不为空时通过，否则抛出异常，使用message信息作为日志输出
     */
    public static void assertNotEmpty(String string, String message) {
        assertNotEmpty(string, message, message);
    }

    /**
     * 判断字符串是否是一个数字，否则抛出异常。自定义日志信息
     */
    public static void assertNumber(String string, String message, String logInfo) {
        assertTrue(NumberUtils.isNumber(string), message, logInfo);
    }

    /**
     * 判断字符串是否是一个数字，否则抛出异常。使用message作为日志信息
     */
    public static void assertNumber(String string, String message) {
        assertNumber(string, message, message);
    }

}
